package Radar;

import java.net.*;
import java.io.*;

public class Tx implements Runnable {
	private int puerto = 15001;
	private ServerSocket serverSocket;
	private ObjectInputStream objectInputStream;
	private ObjectOutputStream objectOutputStream;

	/**
	 * @brief Constructor predeterminado
	 */
	public Tx() {
		Thread hilo = new Thread(this);
		hilo.setName("Transmisor");
		hilo.start();
	}

	/**
	 * @brief Constructor alternativo
	 */
	public Tx(int puerto) {
		this.puerto = puerto;
		Thread hilo = new Thread(this);
		hilo.setName("Transmisor");
		hilo.start();
	}

	/**
	 * @brief Porcion de codigo a ejecutar continuamiente.
	 */
	public void run() {
		iniciarServicio();
		while (true) {
			try {
				Thread.sleep(250);

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @brief Funcion que espera un pedido de conexion, y, al recibirlo Genera
	 *        los IOStreams necesarios para enviar y recibir objetos.
	 */
	private void iniciarServicio() {
		try {
			// Crear el servidor
			serverSocket = new ServerSocket(puerto);
			// Esperar por el pedido de conexion del ServidorEnTierra
			Socket socket = serverSocket.accept();
			System.out.println("El servidor se ha conectado Correctamente");

			// Generar los Streams de datos de entradas necesarios
			InputStream inputStream = socket.getInputStream();
			OutputStream outputStream = socket.getOutputStream();

			// Aca esta lo imporante. Crear un streams de OBJETOS
			// serializables!!
			objectOutputStream = new ObjectOutputStream(outputStream);
			objectInputStream = new ObjectInputStream(inputStream);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @brief Metodo para probar enviar objetos.
	 */
	public void enviarObjeto(Object objeto) {
		try {
			objectOutputStream.writeObject(objeto);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @brief Metodo que recibe un objeto
	 */
	public Object recibirObjeto() {
		Object objeto = null;
		try {
			objeto = objectInputStream.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return objeto;
	}

}
